-- Copyright (c) 2015,2016 Lucky Byte, Inc.
--
-- Summary : 助农取款资金池模块
--
-- Author  : 吴小虎 <xiaohu@lucky-byte.com>
-- Since   : 2016.7.18
--
-- History
--  * 2015.7.18 : 创建此文件
--

-- 从资金池扣取金额
--
-- args.p2_fund_uuid : 资金池 UUID
-- args.amt : 扣取金额，可以为负数
-- args.merno : 商户编号
-- args.termid : 终端编号
-- args.reason : 原因
--
local function _p2_fund_take_from(args)
    local _t = jdbc.select([[
        select * from pay_p2_fund where uuid = ?
    ]], args.p2_fund_uuid)

    if _t.count == 0 then
        logger.error('助农取款资金池[%s]不存在.', args.p2_fund_uuid)
        return false
    end
    local _fund_record = _t.get_record(0)

    -- 变动前余额
    local _old_remains = _fund_record.get('fund_remains')

    -- 记录资金变动
    local _ret = jdbc.update([[
        insert into pay_p2_fund_alter (
            p2_fund, type, remains, amt, merno, termid, notes
        ) values (
            ?, 2, ?, ?, ?, ?, ?
        )
    ]], args.p2_fund_uuid, _old_remains, args.amt,
        args.merno, args.termid, args.notes or '扣手续费')
    if _ret < 0 then
        logger.error('记录资金池[%s]资金变动数据失败.', args.p2_fund_uuid)
        return false
    end

    -- 更新资金池
    local _t = jdbc.select(string.format([[
        update pay_p2_fund set
            fund_remains = fund_remains - %s
            where uuid = ? returning fund_remains, cordon
    ]], args.amt), args.p2_fund_uuid)
    if not _t then
        logger.error('更新助农取款资金池[%s]失败.', args.p2_fund_uuid)
        return false
    end
    local _record = _t.get_record(0)
    local _new_remains = _record.get('fund_remains')

    logger.debug('助农取款资金池资金变动[%s]，变动前余额[%s]，变动后余额[%s].',
        args.amt, _old_remains, _new_remains)

    -- 如果资金池余额低于警戒线，则发送一条通知
    if args.amt > 0 then
        local _cordon  = _record.get('cordon')
        if _new_remains <= _cordon then
            notify.warn('助农取款资金池[%s][%s]的余额[%s]低于警戒线[%s]，请充值.',
                _fund_record.get('name'), _fund_record.get('uuid'),
                _new_remains, _cordon)
        end
    end
    return true
end


-- 归还资金到资金池
local function _p2_fund_give_back(args)
    args.amt = 0 - tonumber(args.amt)
    args.notes = args.notes or '退手续费'
    _p2_fund_take_from(args)
end


core.p2_fund = {
    take_from = _p2_fund_take_from,
    give_back = _p2_fund_give_back,
}
